package br.com.android.financas.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.util.Log;
import br.com.android.financas.R;
import br.com.android.financas.model.Categoria;
import br.com.android.financas.model.Configuracoes;
import br.com.android.financas.model.Despesa;
import br.com.android.financas.model.Poupanca;
import br.com.android.financas.model.Receita;
import br.com.android.financas.model.Recorrente;

import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;

/**
 * Database helper which creates and upgrades the database and provides the DAOs for the app.
 *
 * @author bruno
 */
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

	/************************************************
	 * Suggested Copy/Paste code. Everything from here to the done block.
	 ************************************************/

	private static final String DATABASE_NAME = "financas.db";
	private static final int DATABASE_VERSION = 27;
	private Context context;

	public DatabaseHelper(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config);
		this.context=context;
	}

	/************************************************
	 * Suggested Copy/Paste Done
	 ************************************************/

	@Override
	public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) {
		try {
			TableUtils.createTable(connectionSource, Categoria.class);
			TableUtils.createTable(connectionSource, Despesa.class);
			TableUtils.createTable(connectionSource, Receita.class);
			TableUtils.createTable(connectionSource, Configuracoes.class);
			TableUtils.createTable(connectionSource, Poupanca.class);
			TableUtils.createTable(connectionSource, Recorrente.class);
            createDefault();
		} catch (SQLException e) {
			Log.e(DatabaseHelper.class.getName(), "Unable to create datbases", e);
		}
	}

	@Override
	public void onUpgrade(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource, int oldVer, int newVer) {
		try {
			boolean check=false;
			if(oldVer<26){
				check=true;
		        Dao<Poupanca,Integer> dao2=getDao(Poupanca.class);
				dao2.executeRaw("ALTER TABLE `poupanca` ADD COLUMN atualizado VARCHAR;");
			}

			if(oldVer==26 || check){

				//troca os campos de data para bigint DESPESA
				Dao<Despesa,Integer> dao2=getDao(Despesa.class);
				dao2.executeRaw("ALTER TABLE `despesa` RENAME TO `despesa_orig`;");
				dao2.executeRaw("ALTER TABLE `despesa_orig` ADD COLUMN ndata BIGINT;");
				dao2.executeRaw("update `despesa_orig` SET ndata= (strftime('%s',data)+10800)*1000 ;");
				TableUtils.dropTable(connectionSource, Despesa.class, true);
				TableUtils.createTable(connectionSource, Despesa.class);
				dao2.executeRaw("insert into `despesa`(id,pai_id,recorrente_id,categoria,valor,descricao,data)" +
						"select id,pai_id,recorrente_id,categoria,valor,descricao,ndata from `despesa_orig`;");
				dao2.executeRaw("DROP TABLE `despesa_orig`;");


				//troca os campos de data para bigint RECEITA
				Dao<Receita,Integer> dao3=getDao(Receita.class);
				dao3.executeRaw("ALTER TABLE `receita` RENAME TO `receita_orig`;");
				dao3.executeRaw("ALTER TABLE `receita_orig` ADD COLUMN ndata BIGINT;");
				dao3.executeRaw("update `receita_orig` SET ndata= (strftime('%s',data)+10800)*1000 ;");
				TableUtils.dropTable(connectionSource, Receita.class, true);
				TableUtils.createTable(connectionSource, Receita.class);
				dao3.executeRaw("insert into `receita`(id,pai_id,valor,descricao,data)" +
						"select id,pai_id,valor,descricao,ndata from `receita_orig`;");
				dao3.executeRaw("DROP TABLE `receita_orig`;");

				//troca os campos de data para bigint POUPANACA
				Dao<Poupanca,Integer> dao4=getDao(Poupanca.class);
				dao4.executeRaw("ALTER TABLE `poupanca` RENAME TO `poupanca_orig`;");
				dao4.executeRaw("ALTER TABLE `poupanca_orig` ADD COLUMN ndata BIGINT;");
				dao4.executeRaw("update `poupanca_orig` SET ndata= (strftime('%s',data)+10800)*1000 ;");
				TableUtils.dropTable(connectionSource, Poupanca.class, true);
				TableUtils.createTable(connectionSource, Poupanca.class);
				dao4.executeRaw("insert into `poupanca`(id,pai_id,valor,data,atualizado,despesa)" +
						"select id,pai_id,valor,ndata,atualizado,despesa from `poupanca_orig`;");
				dao4.executeRaw("DROP TABLE `poupanca_orig`;");


				//troca os campos de data para bigint POUPANACA
				Dao<Recorrente,Integer> dao5=getDao(Recorrente.class);
				dao5.executeRaw("ALTER TABLE `recorrente` RENAME TO `recorrente_orig`;");
				dao5.executeRaw("ALTER TABLE `recorrente_orig` ADD COLUMN ndata BIGINT;");
				dao5.executeRaw("update `recorrente_orig` SET ndata= (strftime('%s',data)+10800)*1000 ;");
				TableUtils.dropTable(connectionSource, Recorrente.class, true);
				TableUtils.createTable(connectionSource, Recorrente.class);
				dao5.executeRaw("insert into `recorrente`(id,pai_id,categoria,valor,descricao,data,frequencia)" +
						"select id,pai_id,categoria,valor,descricao,ndata,frequencia from `recorrente_orig`;");
				dao5.executeRaw("DROP TABLE `recorrente_orig`;");
			}


		} catch (SQLException e) {
			Log.e(DatabaseHelper.class.getName(), "Unable to upgrade database from version " + oldVer + " to new "
					+ newVer, e);
		}
	}



    private void createDefault() throws SQLException {

        Dao<Categoria,Integer> dao=getDao(Categoria.class);

        List<Categoria> categorias=new ArrayList<Categoria>();

        Categoria alimentacao=new Categoria();
        alimentacao.setNome(context.getString(R.string.cat_alimentacao));
        alimentacao.setCor(Color.parseColor("#FFFF00"));
        categorias.add(alimentacao);

        Categoria educacao=new Categoria();
        educacao.setNome(context.getString(R.string.cat_educacao));
        educacao.setCor(Color.parseColor("#008000"));
        categorias.add(educacao);

        Categoria lazer=new Categoria();
        lazer.setNome(context.getString(R.string.cat_lazer));
        lazer.setCor(Color.parseColor("#0000FF"));
        categorias.add(lazer);

        Categoria transporte=new Categoria();
        transporte.setNome(context.getString(R.string.cat_transporte));
        transporte.setCor(Color.parseColor("#800000"));
        categorias.add(transporte);


        Categoria saude=new Categoria();
        saude.setNome(context.getString(R.string.cat_saude));
        saude.setCor(Color.parseColor("#00FF00"));
        categorias.add(saude);

        Categoria outros=new Categoria();
        outros.setNome(context.getString(R.string.cat_outros));
        outros.setCor(Color.parseColor("#C0C0C0"));
        categorias.add(outros);

        Categoria gastos=new Categoria();
        gastos.setNome(context.getString(R.string.cat_gastos));
        gastos.setCor(Color.parseColor("#FF00FF"));
        categorias.add(gastos);

        Categoria casa=new Categoria();
        casa.setNome(context.getString(R.string.cat_casa));
        casa.setCor(Color.parseColor("#ffd800"));
        categorias.add(casa);

        Categoria eletronicos=new Categoria();
        eletronicos.setNome(context.getString(R.string.cat_eletronicos));
        eletronicos.setCor(Color.parseColor("#FFA500"));
        categorias.add(eletronicos);

        Categoria carro=new Categoria();
        carro.setNome(context.getString(R.string.cat_carro));
        carro.setCor(Color.parseColor("#4f6796"));
        categorias.add(carro);

        for(Categoria categoria:categorias){
            dao.create(categoria);
        }
    }
}
